﻿using System;
using System.Collections.Generic;
using System.Text;
using WxSDK.Common;
using WxSDK.Config;

namespace WxSDK.WxPay
{
	/// <summary>
	/// 微信支付API
	/// </summary>
	public class WxPayApi
	{
		/// <summary>
		/// 微信转账到零钱。参考网址：https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2
		/// </summary>
		/// <param name="wxData"></param>
		/// <param name="timeOut"></param>
		/// <returns></returns>
		public static WxData WxPayToMoney(WxData wxData, int timeOut = 10)
		{
			try
			{
				if (!wxData.IsSet("amount"))
				{
					throw new WxException("转账金额不能为空！");
				}
				if (!wxData.IsSet("desc"))
				{
					throw new WxException("付款备注不能为空！");
				}
				if (!wxData.IsSet("partner_trade_no"))
				{
					throw new WxException("商户订单号不能为空！");
				}
				if (!wxData.IsSet("openid"))
				{
					throw new WxException("openid不能为空！");
				}
				if (!wxData.IsSet("check_name"))
				{
					throw new WxException("校验用户姓名选项不能为空！");
				}
				else
				{
					if (wxData.GetValue("check_name").ToString() == "FORCE_CHECK")
					{
						if (!wxData.IsSet("re_user_name"))
						{
							throw new WxException("收款用户姓名不能为空！");
						}
					}
				}
				if (!wxData.IsSet("mch_appid"))
				{
					wxData.SetValue("mch_appid", WxConfig.APPID);
				}
				if (!wxData.IsSet("mchid"))
				{
					wxData.SetValue("mchid", WxConfig.MCHID);
				}
				if (!wxData.IsSet("nonce_str"))
				{
					wxData.SetValue("nonce_str", WxUtility.MakeRandomString(32));
				}
				//签名
				string sign = wxData.MakeSign();
				wxData.SetValue("sign", sign);
				string xml = wxData.ToXml();
				string url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";

				//调用HTTP通信接口以提交数据到API
				Log.Debug("WxPayApi", "微信转账到零钱 request数据 : " + xml);
				string response = HttpService.Post(xml, url, true, timeOut);
				Log.Debug("WxPayApi", "微信转账到零钱 response数据 : " + response);

				//将xml格式的结果转换为对象以返回
				WxData result = new WxData();
				result.FromXml(response,false);
				return result;
			}
			catch (Exception ex)
			{
				throw new WxException(ex.Message);
			}
		}
		/// <summary>
		/// 查询微信转账到零钱订单。参考网址：https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_3
		/// </summary>
		/// <param name="wxData"></param>
		/// <param name="timeOut"></param>
		/// <returns></returns>
		public static WxData QueryWxPayToMoney(WxData wxData, int timeOut = 30)
		{
			string url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo";
			try
			{
				if (!wxData.IsSet("partner_trade_no"))
				{
					throw new WxException("商户订单号不能为空！");
				}
				if (!wxData.IsSet("appid"))
				{
					wxData.SetValue("appid", WxConfig.APPID);
				}
				if (!wxData.IsSet("mch_id"))
				{
					wxData.SetValue("mch_id", WxConfig.MCHID);
				}
				if (!wxData.IsSet("nonce_str"))
				{
					wxData.SetValue("nonce_str", WxUtility.MakeRandomString(32));
				}
				//签名
				string sign = wxData.MakeSign();
				wxData.SetValue("sign", sign);
				string xml = wxData.ToXml();

				//调用HTTP通信接口以提交数据到API
				Log.Debug("WxPayApi", "查询微信转账到零钱订单 request数据 : " + xml);
				string response = HttpService.Post(xml, url, true, timeOut);
				Log.Debug("WxPayApi", "查询微信转账到零钱订单 response数据 : " + response);

				//将xml格式的结果转换为对象以返回
				WxData result = new WxData();
				result.FromXml(response, false);
				return result;
			}
			catch (Exception ex)
			{
				throw new WxException(ex.Message);
			}
		}

		/// <summary>
		/// 提交刷卡支付API。成功时返回调用结果，其他抛异常。
		/// 收银员使用扫码设备读取微信用户刷卡授权码以后，二维码或条码信息传送至商户收银台，
		/// 由商户收银台或者商户后台调用该接口发起支付。
		/// </summary>
		/// <param name="inputObj">提交给被扫支付API的参数</param>
		/// <param name="timeOut">超时时间</param>
		/// <returns></returns>
		public static WxData Micropay(WxData inputObj, int timeOut = 10)
		{
			string url = "https://api.mch.weixin.qq.com/pay/micropay";
			//检测必填参数
			if (!inputObj.IsSet("body"))
			{
				throw new WxException("提交被扫支付API接口中，缺少必填参数body！");
			}
			else if (!inputObj.IsSet("out_trade_no"))
			{
				throw new WxException("提交被扫支付API接口中，缺少必填参数out_trade_no！");
			}
			else if (!inputObj.IsSet("total_fee"))
			{
				throw new WxException("提交被扫支付API接口中，缺少必填参数total_fee！");
			}
			else if (!inputObj.IsSet("auth_code"))
			{
				throw new WxException("提交被扫支付API接口中，缺少必填参数auth_code！");
			}

			inputObj.SetValue("spbill_create_ip", WxConfig.IP);//终端ip
			inputObj.SetValue("appid", WxConfig.APPID);//公众账号ID
			inputObj.SetValue("mch_id", WxConfig.MCHID);//商户号
			inputObj.SetValue("nonce_str", Guid.NewGuid().ToString().Replace("-", ""));//随机字符串
			inputObj.SetValue("sign", inputObj.MakeSign());//签名
			string xml = inputObj.ToXml();

			DateTime start = DateTime.Now;//请求开始时间

			Log.Debug("WxPayApi", "刷卡支付 request数据 : " + xml);
			string response = HttpService.Post(xml, url, false, timeOut);//调用HTTP通信接口以提交数据到API
			Log.Debug("WxPayApi", "刷卡支付 response数据 : " + response);

			DateTime end = DateTime.Now;
			int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时

			//将xml格式的结果转换为对象以返回
			WxData result = new WxData();
			result.FromXml(response);

			ReportCostTime(url, timeCost, result);//测速上报

			return result;
		}

		/// <summary>
		/// 查询订单。成功时返回订单查询结果，其他抛异常
		/// </summary>
		/// <param name="inputObj">提交给查询订单API的参数</param>
		/// <param name="timeOut">超时时间</param>
		/// <returns></returns>
		public static WxData OrderQuery(WxData inputObj, int timeOut = 6)
		{
			string url = "https://api.mch.weixin.qq.com/pay/orderquery";
			//检测必填参数
			if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id"))
			{
				throw new WxException("订单查询接口中，out_trade_no、transaction_id至少填一个！");
			}

			inputObj.SetValue("appid", WxConfig.APPID);//公众账号ID
			inputObj.SetValue("mch_id", WxConfig.MCHID);//商户号
			inputObj.SetValue("nonce_str", WxPayApi.GenerateNonceStr());//随机字符串
			inputObj.SetValue("sign", inputObj.MakeSign());//签名

			string xml = inputObj.ToXml();

			DateTime start = DateTime.Now;

			Log.Debug("WxPayApi", "订单查询 request数据 : " + xml);
			string response = HttpService.Post(xml, url, false, timeOut);//调用HTTP通信接口提交数据
			Log.Debug("WxPayApi", "订单查询 response数据 : " + response);

			DateTime end = DateTime.Now;
			int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时

			//将xml格式的数据转化为对象以返回
			WxData result = new WxData();
			result.FromXml(response);

			ReportCostTime(url, timeCost, result);//测速上报

			return result;
		}

		/// <summary>
		/// 撤销订单API接口。成功时返回API调用结果，其他抛异常
		/// </summary>
		/// <param name="inputObj">提交给撤销订单API接口的参数，out_trade_no和transaction_id必填一个</param>
		/// <param name="timeOut">接口超时时间</param>
		/// <returns></returns>
		public static WxData Reverse(WxData inputObj, int timeOut = 6)
		{
			string url = "https://api.mch.weixin.qq.com/secapi/pay/reverse";
			//检测必填参数
			if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id"))
			{
				throw new WxException("撤销订单API接口中，参数out_trade_no和transaction_id必须填写一个！");
			}

			inputObj.SetValue("appid", WxConfig.APPID);//公众账号ID
			inputObj.SetValue("mch_id", WxConfig.MCHID);//商户号
			inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
			inputObj.SetValue("sign", inputObj.MakeSign());//签名
			string xml = inputObj.ToXml();

			DateTime start = DateTime.Now;//请求开始时间

			Log.Debug("WxPayApi", "撤销订单 request数据 : " + xml);

			string response = HttpService.Post(xml, url, true, timeOut);

			Log.Debug("WxPayApi", "撤销订单 response数据 : " + response);

			DateTime end = DateTime.Now;
			int timeCost = (int)((end - start).TotalMilliseconds);

			WxData result = new WxData();
			result.FromXml(response);

			ReportCostTime(url, timeCost, result);//测速上报

			return result;
		}

		/// <summary>
		/// 申请退款，成功时返回接口调用结果，其他抛异常
		/// </summary>
		/// <param name="inputObj">提交给申请退款API的参数</param>
		/// <param name="timeOut">超时时间</param>
		/// <returns></returns>
		public static WxData Refund(WxData inputObj, int timeOut = 6)
		{
			string url = "https://api.mch.weixin.qq.com/secapi/pay/refund";
			//检测必填参数
			if (!inputObj.IsSet("out_trade_no") && !inputObj.IsSet("transaction_id"))
			{
				throw new WxException("退款申请接口中，out_trade_no、transaction_id至少填一个！");
			}
			else if (!inputObj.IsSet("out_refund_no"))
			{
				throw new WxException("退款申请接口中，缺少必填参数out_refund_no！");
			}
			else if (!inputObj.IsSet("total_fee"))
			{
				throw new WxException("退款申请接口中，缺少必填参数total_fee！");
			}
			else if (!inputObj.IsSet("refund_fee"))
			{
				throw new WxException("退款申请接口中，缺少必填参数refund_fee！");
			}

			if (!inputObj.IsSet("appid"))
			{
				inputObj.SetValue("appid", WxConfig.APPID);//公众账号ID
			}
			if (!inputObj.IsSet("mch_id"))
			{
				inputObj.SetValue("mch_id", WxConfig.MCHID);//商户号
			}
			inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
			inputObj.SetValue("sign", inputObj.MakeSign());//签名

			string xml = inputObj.ToXml();
			DateTime start = DateTime.Now;

			Log.Debug("WxPayApi", "退款申请 request数据 : " + xml);
			string response = HttpService.Post(xml, url, true, timeOut);//调用HTTP通信接口提交数据到API
			Log.Debug("WxPayApi", "退款申请 response数据 : " + response);

			DateTime end = DateTime.Now;
			int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时

			//将xml格式的结果转换为对象以返回
			WxData result = new WxData();
			result.FromXml(response);

			ReportCostTime(url, timeCost, result);//测速上报

			return result;
		}

		/// <summary>
		/// 查询退款，提交退款申请后，通过该接口查询退款状态。
		/// 退款有一定延时，用零钱支付的退款20分钟内到账，银行卡支付的退款3个工作日后重新查询退款状态。
		/// out_refund_no、out_trade_no、transaction_id、refund_id四个参数必填一个
		/// </summary>
		/// <param name="inputObj">提交给查询退款API的参数</param>
		/// <param name="timeOut">接口超时时间</param>
		/// <returns></returns>
		public static WxData RefundQuery(WxData inputObj, int timeOut = 6)
		{
			string url = "https://api.mch.weixin.qq.com/pay/refundquery";
			//检测必填参数
			if (!inputObj.IsSet("out_refund_no") && !inputObj.IsSet("out_trade_no") &&
				!inputObj.IsSet("transaction_id") && !inputObj.IsSet("refund_id"))
			{
				throw new WxException("退款查询接口中，out_refund_no、out_trade_no、transaction_id、refund_id四个参数必填一个！");
			}

			inputObj.SetValue("appid", WxConfig.APPID);//公众账号ID
			inputObj.SetValue("mch_id", WxConfig.MCHID);//商户号
			inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
			inputObj.SetValue("sign", inputObj.MakeSign());//签名

			string xml = inputObj.ToXml();

			DateTime start = DateTime.Now;//请求开始时间

			Log.Debug("WxPayApi", "退款查询 request数据 : " + xml);
			string response = HttpService.Post(xml, url, false, timeOut);//调用HTTP通信接口以提交数据到API
			Log.Debug("WxPayApi", "退款查询 response数据 : " + response);

			DateTime end = DateTime.Now;
			int timeCost = (int)((end - start).TotalMilliseconds);//获得接口耗时

			//将xml格式的结果转换为对象以返回
			WxData result = new WxData();
			result.FromXml(response);

			ReportCostTime(url, timeCost, result);//测速上报

			return result;
		}

		/// <summary>
		/// 下载对账单
		/// </summary>
		/// <param name="inputObj">提交给下载对账单API的参数</param>
		/// <param name="timeOut">接口超时时间</param>
		/// <returns></returns>
		public static WxData DownloadBill(WxData inputObj, int timeOut = 6)
		{
			string url = "https://api.mch.weixin.qq.com/pay/downloadbill";
			//检测必填参数
			if (!inputObj.IsSet("bill_date"))
			{
				throw new WxException("对账单接口中，缺少必填参数bill_date！");
			}

			inputObj.SetValue("appid", WxConfig.APPID);//公众账号ID
			inputObj.SetValue("mch_id", WxConfig.MCHID);//商户号
			inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
			inputObj.SetValue("sign", inputObj.MakeSign());//签名

			string xml = inputObj.ToXml();

			Log.Debug("WxPayApi", "下载对账单 request数据 : " + xml);
			string response = HttpService.Post(xml, url, false, timeOut);//调用HTTP通信接口以提交数据到API
			Log.Debug("WxPayApi", "下载对账单 result数据 : " + response);

			WxData result = new WxData();
			//若接口调用失败会返回xml格式的结果
			if (response.Substring(0, 5) == "<xml>")
			{
				result.FromXml(response);
			}
			//接口调用成功则返回非xml格式的数据
			else
				result.SetValue("result", response);

			return result;
		}

		/// <summary>
		/// 转换短链接。
		/// 该接口主要用于扫码原生支付模式一中的二维码链接转成短链接(weixin://wxpay/s/XXXXXX)，
		/// 减小二维码数据量，提升扫描速度和精确度。
		/// </summary>
		/// <param name="inputObj">提交给转换短连接API的参数</param>
		/// <param name="timeOut">接口超时时间</param>
		/// <returns></returns>
		public static WxData ShortUrl(WxData inputObj, int timeOut = 6)
		{
			string url = "https://api.mch.weixin.qq.com/tools/shorturl";
			//检测必填参数
			if (!inputObj.IsSet("long_url"))
			{
				throw new WxException("需要转换的URL，签名用原串，传输需URL encode！");
			}

			inputObj.SetValue("appid", WxConfig.APPID);//公众账号ID
			inputObj.SetValue("mch_id", WxConfig.MCHID);//商户号
			inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串	
			inputObj.SetValue("sign", inputObj.MakeSign());//签名
			string xml = inputObj.ToXml();

			DateTime start = DateTime.Now;//请求开始时间

			Log.Debug("WxPayApi", "转换短链接 request数据 : " + xml);
			string response = HttpService.Post(xml, url, false, timeOut);
			Log.Debug("WxPayApi", "转换短链接 response数据 : " + response);

			DateTime end = DateTime.Now;
			int timeCost = (int)((end - start).TotalMilliseconds);

			WxData result = new WxData();
			result.FromXml(response);
			ReportCostTime(url, timeCost, result);//测速上报

			return result;
		}

		/// <summary>
		/// 统一下单
		/// </summary>
		/// <param name="inputObj">提交给统一下单API的参数</param>
		/// <param name="timeOut">超时时间</param>
		/// <returns></returns>
		public static WxData UnifiedOrder(WxData inputObj, int timeOut = 10)
		{
			string url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
			//检测必填参数
			if (!inputObj.IsSet("out_trade_no"))
			{
				throw new WxException("缺少统一支付接口必填参数out_trade_no！");
			}
			else if (!inputObj.IsSet("body"))
			{
				throw new WxException("缺少统一支付接口必填参数body！");
			}
			else if (!inputObj.IsSet("total_fee"))
			{
				throw new WxException("缺少统一支付接口必填参数total_fee！");
			}
			else if (!inputObj.IsSet("trade_type"))
			{
				throw new WxException("缺少统一支付接口必填参数trade_type！");
			}

			//关联参数
			if (inputObj.GetValue("trade_type").ToString() == "JSAPI" && !inputObj.IsSet("openid"))
			{
				throw new WxException("统一支付接口中，缺少必填参数openid！trade_type为JSAPI时，openid为必填参数！");
			}
			if (inputObj.GetValue("trade_type").ToString() == "NATIVE" && !inputObj.IsSet("product_id"))
			{
				throw new WxException("统一支付接口中，缺少必填参数product_id！trade_type为NATIVE时，product_id为必填参数！");
			}

			//异步通知url未设置，则使用配置文件中的url
			if (!inputObj.IsSet("notify_url"))
			{
				inputObj.SetValue("notify_url", WxConfig.NOTIFY_URL);//异步通知url
			}

			//终端ip
			if (inputObj.GetValue("trade_type").ToString() == "JSAPI")
			{
				inputObj.SetValue("spbill_create_ip", WxUtility.GetClientIP());
			}
			else if (inputObj.GetValue("trade_type").ToString() == "NATIVE")
			{
				inputObj.SetValue("spbill_create_ip", WxConfig.IP);
			}
			else
			{
				inputObj.SetValue("spbill_create_ip", WxUtility.GetClientIP());
			}
			if (!inputObj.IsSet("appid"))
			{
				inputObj.SetValue("appid", WxConfig.APPID);//公众账号ID
			}
			if (!inputObj.IsSet("mch_id"))
			{
				inputObj.SetValue("mch_id", WxConfig.MCHID);//商户号
			}
			inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串

			//签名
			inputObj.SetValue("sign", inputObj.MakeSign());
			string xml = inputObj.ToXml();

			DateTime start = DateTime.Now;

			Log.Debug("WxPayApi", "统一下单 request数据 : " + xml);
			string response = HttpService.Post(xml, url, false, timeOut);
			Log.Debug("WxPayApi", "统一下单 response数据 : " + response);

			DateTime end = DateTime.Now;
			int timeCost = (int)((end - start).TotalMilliseconds);

			WxData result = new WxData();
			result.FromXml(response);

			ReportCostTime(url, timeCost, result);//测速上报

			return result;
		}

		/// <summary>
		/// 关闭订单
		/// </summary>
		/// <param name="inputObj">提交给关闭订单API的参数</param>
		/// <param name="timeOut">接口超时时间</param>
		/// <returns></returns>
		public static WxData CloseOrder(WxData inputObj, int timeOut = 6)
		{
			string url = "https://api.mch.weixin.qq.com/pay/closeorder";
			//检测必填参数
			if (!inputObj.IsSet("out_trade_no"))
			{
				throw new WxException("关闭订单接口中，out_trade_no必填！");
			}

			inputObj.SetValue("appid", WxConfig.APPID);//公众账号ID
			inputObj.SetValue("mch_id", WxConfig.MCHID);//商户号
			inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串		
			inputObj.SetValue("sign", inputObj.MakeSign());//签名
			string xml = inputObj.ToXml();

			DateTime start = DateTime.Now;//请求开始时间

			string response = HttpService.Post(xml, url, false, timeOut);

			DateTime end = DateTime.Now;
			int timeCost = (int)((end - start).TotalMilliseconds);

			WxData result = new WxData();
			result.FromXml(response);

			ReportCostTime(url, timeCost, result);//测速上报

			return result;
		}

		/// <summary>
		/// 测速上报接口实现。成功时返回测速上报接口返回的结果，其他抛异常
		/// </summary>
		/// <param name="inputObj">提交给测速上报接口的参数</param>
		/// <param name="timeOut">测速上报接口超时时间（秒）</param>
		/// <returns></returns>
		public static WxData Report(WxData inputObj, int timeOut = 1)
		{
			string url = "https://api.mch.weixin.qq.com/payitil/report";
			//检测必填参数
			if (!inputObj.IsSet("interface_url"))
			{
				throw new WxException("接口URL，缺少必填参数interface_url！");
			}
			if (!inputObj.IsSet("return_code"))
			{
				throw new WxException("返回状态码，缺少必填参数return_code！");
			}
			if (!inputObj.IsSet("result_code"))
			{
				throw new WxException("业务结果，缺少必填参数result_code！");
			}
			if (!inputObj.IsSet("user_ip"))
			{
				throw new WxException("访问接口IP，缺少必填参数user_ip！");
			}
			if (!inputObj.IsSet("execute_time_"))
			{
				throw new WxException("接口耗时，缺少必填参数execute_time_！");
			}

			inputObj.SetValue("appid", WxConfig.APPID);//公众账号ID
			inputObj.SetValue("mch_id", WxConfig.MCHID);//商户号
			inputObj.SetValue("user_ip", WxConfig.IP);//终端ip
			inputObj.SetValue("time", DateTime.Now.ToString("yyyyMMddHHmmss"));//商户上报时间	 
			inputObj.SetValue("nonce_str", GenerateNonceStr());//随机字符串
			inputObj.SetValue("sign", inputObj.MakeSign());//签名
			string xml = inputObj.ToXml();

			Log.Info("WxPayApi", "测试上报 request数据 : " + xml);

			string response = HttpService.Post(xml, url, false, timeOut);

			Log.Info("WxPayApi", "测试上报 response数据 : " + response);

			WxData result = new WxData();
			result.FromXml(response);
			return result;
		}

		/// <summary>
		/// 测速上报
		/// </summary>
		/// <param name="interface_url">接口URL</param>
		/// <param name="timeCost">接口耗时</param>
		/// <param name="inputObj">参数数组</param>
		private static void ReportCostTime(string interface_url, int timeCost, WxData inputObj)
		{
			//如果不需要进行上报
			if (WxConfig.REPORT_LEVENL == 0)
			{
				return;
			}

			//如果仅失败上报
			if (WxConfig.REPORT_LEVENL == 1 && inputObj.IsSet("return_code")
				&& inputObj.GetValue("return_code").ToString() == "SUCCESS"
				&& inputObj.IsSet("result_code")
				&& inputObj.GetValue("result_code").ToString() == "SUCCESS")
			{
				return;
			}

			//上报逻辑
			WxData data = new WxData();
			data.SetValue("interface_url", interface_url);
			data.SetValue("execute_time_", timeCost);
			//返回状态码
			if (inputObj.IsSet("return_code"))
			{
				data.SetValue("return_code", inputObj.GetValue("return_code"));
			}
			//返回信息
			if (inputObj.IsSet("return_msg"))
			{
				data.SetValue("return_msg", inputObj.GetValue("return_msg"));
			}
			//业务结果
			if (inputObj.IsSet("result_code"))
			{
				data.SetValue("result_code", inputObj.GetValue("result_code"));
			}
			//错误代码
			if (inputObj.IsSet("err_code"))
			{
				data.SetValue("err_code", inputObj.GetValue("err_code"));
			}
			//错误代码描述
			if (inputObj.IsSet("err_code_des"))
			{
				data.SetValue("err_code_des", inputObj.GetValue("err_code_des"));
			}
			//商户订单号
			if (inputObj.IsSet("out_trade_no"))
			{
				data.SetValue("out_trade_no", inputObj.GetValue("out_trade_no"));
			}
			//设备号
			if (inputObj.IsSet("device_info"))
			{
				data.SetValue("device_info", inputObj.GetValue("device_info"));
			}

			try
			{
				Report(data);
			}
			catch (WxException)
			{
				//不做任何处理
			}
		}

		/// <summary>
		/// 生成订单号：微信支付商户号+当前系统时间+随机序列号
		/// </summary>
		/// <returns></returns>
		public static string GenerateOutTradeNo()
		{
			var ran = new Random();
			return string.Format("{0}{1}{2}", WxConfig.MCHID, DateTime.Now.ToString("yyyyMMddHHmmss"), ran.Next(999));
		}

		/// <summary>
		/// 生成时间戳，标准北京时间，时区为东八区，自1970年1月1日 0点0分0秒以来的秒数
		/// </summary>
		/// <returns></returns>
		public static string GenerateTimeStamp()
		{
			TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
			return Convert.ToInt64(ts.TotalSeconds).ToString();
		}

		/// <summary>
		/// 根据GUID来生成随机串，随机串包含字母或数字
		/// </summary>
		/// <returns></returns>
		public static string GenerateNonceStr()
		{
			return Guid.NewGuid().ToString().Replace("-", "");
		}
	}
}
